package com.fpd.tools;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.fpd.model.entity.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.fpd.constant.SystemConstant;
import com.fpd.exceptions.NoLoginException;

/**
 * @desc token工具类
 * @author wujiangbo
 * @date 2019年11月7日 下午2:45:10
 */
@Component
public class TokenUtil {

	@Value("${token.tokenTimeout}")
	private int tokenTimeout;

	@Autowired
	private RedisTemplate<Object, Object> redisTemplate;

	/**
	 * @desc 获取Redis服务器中的用户信息
	 * @author wujiangbo
	 * @date 2019年11月15日 上午11:40:17
	 * @return
	 */
	public SysUser getRedisUser() {
		// 获取当前用户token
		String headerToken = getToken();
		if (Tool.isBlank(headerToken)) {
			throw new NoLoginException("请求头head中token信息为空");
		}
		// 从Redis服务器中获取用户信息
		Map<Object, Object> map = redisTemplate.opsForHash().entries(SystemConstant.REDIS_USER_INFO_KEY + headerToken);//entries(H key)获取变量中的键值对。获取headerToken中的键值对
		if (map == null) {
			throw new NoLoginException("用户信息为空，请重新登录");
		}
		SysUser user = (SysUser) map.get(SystemConstant.MAP_USER_INFO_KEY);//String MAP_USER_INFO_KEY = "userInfo";通过键值获取键值
		if (user == null) {
			throw new NoLoginException("用户信息为空，请重新登录");
		}
		return user;//Redis服务器中的用户信息
	}

	/**
	 * @desc 获取请求头中的token参数值
	 * @author wujiangbo
	 * @date 2019年11月15日 下午2:32:11
	 * @return
	 */
	public String getToken() {
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = requestAttributes.getRequest();
		String token = request.getHeader("token");
		return token;
	}

}
